package com.abner.seven.principle.liskov;

/**
 * 设计模式七大原则:
 * 		里氏替换原则:
 * 			1) 里氏替换原则(Liskov Substitution Principle)在 1988 年，由麻省理工学院的以为姓里的女士提出的。
 * 			2) 如果对每个类型为 T1 的对象 o1，都有类型为 T2 的对象 o2，使得以 T1 定义的所有程序 P 在所有的对象 o1 都
 * 			  代换成 o2 时，程序 P 的行为没有发生变化，那么类型 T2 是类型 T1 的子类型。
 * 			  换句话说，所有引用基类的地方必须能透明地使用其子类的对象。
 * 			3) 在使用继承时，遵循里氏替换原则，在子类中尽量不要重写父类的方法
 * 			4) 里氏替换原则告诉我们，继承实际上让两个类耦合性增强了，在适当的情况下，可以通过聚合，组合，依赖 来解决问题
 * @author abner
 */
public class Liskov {

	public static void main(String[] args) {

		A a = new A();
		System.out.println("11-3=" + a.func1(11, 3));
		System.out.println("1-8=" + a.func1(1, 8));

		System.out.println("-----------------------");

		B b = new B();
		System.out.println("11-3=" + b.func1(11, 3));
		System.out.println("1-8=" + b.func1(1, 8));
		System.out.println("11+3+9=" + b.func2(11, 3));

	}

}

class A {
	/**
	 * 求差
	 * @param num1
	 * @param num2
	 * @return
	 */
	public int func1(int num1, int num2) {
		return num1 - num2;
	}
}


class B extends A {
	@Override
	public int func1(int a, int b) {
		return a + b;
	}

	public int func2(int a, int b) {
		return func1(a, b) + 9;
	}
}
